/*
 * PlanetaA.cpp
 *
 *  Created on: Mar 31, 2010
 *      Author: jgrande
 */

#include <iostream>
#include <sstream>

#include "../../Aplicacion/Common/InformacionCreacionUniverso.h"

#include "../../Aplicacion/Modelo/Common/JuegoDTO.h"
#include "../../Aplicacion/Modelo/Common/JugadorDTO.h"

#include "../../Aplicacion/Infraestructura/Directorio.h"
#include "../../Aplicacion/Infraestructura/DirectorioImpl.h"

#include "../../Framework/IO/log.h"
#include "../../Framework/Common/utiles.h"

#include "../../Middleware/Comunicaciones/MiddlewareCliente.h"

using aplicacion::DirectorioSingleton;
using aplicacion::Directorio;
using aplicacion::JuegoDTO;
using aplicacion::JugadorDTO;
using aplicacion::InformacionCreacionUniverso;

void sigint_handler(int signal) {
	MiddlewareClienteSingleton::instance().finish();
	exit(0);
}


bool registrarJugador(JuegoDTO& juego, JugadorDTO& jugador) {
	Directorio& dir = DirectorioSingleton::instance();

	juego.idJuego = 1;

	// acá debería completar la información del planeta, que todavía
	// no la estoy usando para nada

	logger << "Presione ENTER para registrar el jugador" << logger.endl;
	getchar();

	if(!dir.add(juego, jugador)) {
		return false;
	}

	if(!dir.esperarComienzo(jugador)) {
		return false;
	}

	return true;
}

bool main_loop() {
	MiddlewareCliente& mw = MiddlewareClienteSingleton::instance();
	uint8_t buff[MAX_DATOS];

	logger << "recibiendo mensajes multicast" << logger.endl;
	while(mw.recvMulticast(buff)) {
		logger << "mensaje recibido:\n\t> " << (char*)buff << logger.endl;
	}

	return true;
}

int main(int argc, char* argv[]) {
	JuegoDTO juego;
	JugadorDTO jugador;
	InformacionCreacionUniverso universo;

	if(!MiddlewareClienteSingleton::instance().start()) {
		logger << "error inicializando middleware" << logger.endl;
		return 1;
	}

	Utiles::registrar_signal(SIGINT, sigint_handler);	

	if(!registrarJugador(juego, jugador)) {
		logger << "error registrando jugador" << logger.endl;
		return 1;
	}

	main_loop();

	MiddlewareClienteSingleton::instance().finish();

	return 0;
}
